﻿
namespace FastFood.Windows.Forms.Procesos
{
    using System;
    using System.Collections.Generic;
    using System.Data.Linq;
    using System.Drawing;
    using System.Linq;
    using System.Windows.Forms;
    using FastFood.Business.Entities;
    using FastFood.Business.Entities.Tipos;
    using FastFood.Business.Logic;
    using FastFood.Windows.Helpers;
    using System.Configuration;

    public partial class CwfVentas : UserControl
    {
        private CwfClienteBusqueda cwfClienteBusqueda;
        private Font font;
        public decimal total
        {
            set
            {
                this.txtTotal.Text = value.ToString();
                CalcularVuelto();
            }
        }
        public EstadoActual estadoActual;
        
        double _porcIGV;
        double _porcServicios;

        public CwfVentas()
        {
            InitializeComponent();
            SetFont();
        }

        private void CwfPlatos_Load(object sender, EventArgs e)
        {
            if (!DesignMode)
            {
                this.TsMenu.FormularioID = Convert.ToByte(this.Tag);
                this.TsMenu.LoadPermisos();
                this.cwfDetallesVentas1.cwfVentas = this;
                ClearControls();
                cmbVentasEstados.SelectedIndex = 0;
                LoadFormaPago();
                InitialLoad();
                EnabledControls(true);
                EnabledButtons(true);

                cwfClienteBusqueda = new CwfClienteBusqueda();
                cwfClienteBusqueda.CwfProveedorBusqueda_SeleccionEntidad += new GetObjeto(clienteBusqueda_SeleccionEntidad);
                cwfClienteBusqueda.BorderStyle = BorderStyle.None;
                clienteCmb.DropDownControl = cwfClienteBusqueda;
            }
        }

        private void Focus_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar == Convert.ToChar(Keys.Enter))
            {
                e.Handled = true;
                SendKeys.Send("{TAB}");
            }
        }

        private void TsbNuevo_Click(object sender, EventArgs e)
        {
            this.estadoActual = EstadoActual.Nuevo;
            EnabledControls(false);
            EnabledButtons(false);
            ClearControls();
            this.cwfDetallesVentas1.ListaDetalle = new List<DetalleVendibles>();
            this.cwfDetallesVentas1.InitialLoad();
            splitContainer3.Focus();
            this.ventaBindingSource.AddNew();
        }

        private void TsbEditar_Click(object sender, EventArgs e)
        {
            if (this.ventaBindingSource.Current == null) return;
            this.estadoActual = EstadoActual.Editar;
            EnabledControls(false);
            EnabledButtons(false);
            this.clienteCmb.Focus();
        }

        private void TsbEliminar_Click(object sender, EventArgs e)
        {
            if (this.ventaBindingSource.Current == null) return;
            if (Mensaje.ShowMessageConfirm(this.ParentForm, Constantes.Titulo, "¿Desea eliminar el Registro?") == DialogResult.Yes)
            {
                this.estadoActual = EstadoActual.Eliminar;
                SaveData();
                this.estadoActual = EstadoActual.Normal;
                if (this.ventaBindingSource.Current != null)
                {
                    LoadVenta(this.ventaBindingSource.Current as Ventas);
                }
            }
        }

        private void TsbGuardar_Click(object sender, EventArgs e)
        {
            if (ValidateData())
            {
                if (SaveData())
                {
                    this.estadoActual = EstadoActual.Normal;
                    if (this.ventaBindingSource.Current != null)
                    {
                        LoadVenta(this.ventaBindingSource.Current as Ventas);
                    }
                    EnabledControls(true);
                    EnabledButtons(true);
                    this.ventaDataGridView.Focus();
                }
            }
        }

        private void TsbCancelar_Click(object sender, EventArgs e)
        {
            if (this.estadoActual == EstadoActual.Nuevo)
            {
                ClearControls();
                this.cwfDetallesVentas1.ListaDetalle = new List<DetalleVendibles>();
                this.cwfDetallesVentas1.InitialLoad();
            }
            this.estadoActual = EstadoActual.Normal;
            EnabledControls(true);
            EnabledButtons(true);
            this.ventaBindingSource.CancelEdit();
            this.ventaDataGridView.Focus();
        }

        private void TsbImprimir_Click(object sender, EventArgs e)
        {
            if (this.ventaBindingSource.Current == null) return;
            if (Mensaje.ShowMessageConfirm(this.ParentForm, Constantes.Titulo, "¿Desea Imprimir?") == DialogResult.Yes)
            {
                var venta = this.ventaBindingSource.Current as Ventas;
                Imprimir(venta.ventaID, Convert.ToDecimal(this.txtTotal.Text), 0);
            }
        }

        private void platoDataGridView_CellEnter(object sender, DataGridViewCellEventArgs e)
        {
            if (e.RowIndex != -1 && e.ColumnIndex != -1)
            {
                if (this.estadoActual == EstadoActual.Normal)
                    LoadVenta(this.ventaBindingSource.Current as Ventas);
            }
        }

        private void platoDataGridView_KeyDown(object sender, KeyEventArgs e)
        {
            if (this.estadoActual != EstadoActual.Normal) return;
            if (e.KeyCode == Keys.Delete)
            {
                if (this.ventaDataGridView.SelectedRows.Count != 0)
                {
                    if (Mensaje.ShowMessageConfirm(this.ParentForm, Constantes.Titulo, "¿Desea eliminar el Registro?") == DialogResult.No)
                    {
                        e.Handled = true;
                    }
                    else
                    {
                        this.estadoActual = EstadoActual.Eliminar;
                        SaveData();
                        this.estadoActual = EstadoActual.Normal;
                        if (this.ventaBindingSource.Current != null)
                        {
                            LoadVenta(this.ventaBindingSource.Current as Ventas);
                        }
                    }
                }
            }
        }

        private void InitialLoad()
        {
            if (cmbVentasEstados.SelectedIndex != -1)
            {
                try
                {
                    VentasManager ventaManager = new VentasManager();
                    List<Ventas> temp = new List<Ventas>(ventaManager.ListarByEstado(cmbVentasEstados.Text));
                    this.ventaBindingSource.DataSource = temp;
                    this.ventaBindingNavigator.BindingSource = this.ventaBindingSource;
                }
                catch (Exception ex)
                {
                    Mensaje.ShowMessageAlert(this.ParentForm, Constantes.Titulo, ex.Message);
                }
            }
        }

        private void LoadFormaPago()
        {
            this.cmbFormaPago.Items.Clear();
            string[] formas = Enum.GetNames(typeof(FormasPago));
            this.cmbFormaPago.DataSource = formas;
            //this.cmbFormaPago.Items.AddRange(formas);
            this.cmbFormaPago.SelectedIndex = -1;
        }

        private void LoadCorrelativo(List<Correlativos> coleccion)
        {
            try
            {
                cmbCorrelativos.DataSource = coleccion;
                cmbCorrelativos.DisplayMember = "serie";
                cmbCorrelativos.ValueMember = "correlativoID";
                cmbCorrelativos.SelectedIndex = 0;
                numeroTextBox.Text = coleccion[0].numeroActual.ToString();
            }
            catch (Exception ex)
            {
                Mensaje.ShowMessageAlert(this.ParentForm, Constantes.Titulo, ex.Message);
            }
        }

        private void LoadVenta(Ventas venta)
        {
            venta = VentasManager.Instancia.Obtener(venta.ventaID);
            this.lblCodigo.CargarCodigo(MotivoMovimiento.Ventas, venta.ventaID);
            this.ventaIDLabel.Text = venta.ventaID.ToString();
            this.clienteIDLabel.Text = venta.clienteID.ToString();
            this.clienteCmb.Text = venta.nombreCliente;
            this.cmbTipoDocumento.SelectedIndex = venta.Correlativos.tipoDocumento;
            this.cmbCorrelativos.SelectedValue = venta.correlativoID;
            this.cmbFormaPago.SelectedIndex = venta.formaPago;
            this._porcIGV = this.cwfDetallesVentas1.PorcIGV = venta.IGV;
            this._porcServicios = this.cwfDetallesVentas1.PorcServicios = venta.servicios;

            List<Correlativos> coleccion = new List<Correlativos>();
            coleccion.Add(venta.Correlativos);
            LoadCorrelativo(coleccion);
            this.numeroTextBox.Text = venta.numero;
            this.cwfDetallesVentas1.ListaDetalle = venta.detalles.ToList() ?? new List<DetalleVendibles>();
            this.cwfDetallesVentas1.InitialLoad();
            this.txtPago.Text = txtTotal.Text;
        }

        private bool SaveData()
        {
            bool result = false;
            try
            {
                switch (this.estadoActual)
                {
                    case EstadoActual.Nuevo:
                        var ventaID = VentasManager.Instancia.Agregar(GetVenta());
                        Imprimir(ventaID, Convert.ToDecimal(txtPago.Text), Convert.ToDecimal(txtVuelto.Text));
                        break;
                    case EstadoActual.Editar:
                        VentasManager.Instancia.Modificar(GetVenta());
                        break;
                    case EstadoActual.Eliminar:
                        VentasManager.Instancia.Eliminar(GetVenta());
                        this.ventaBindingSource.RemoveCurrent();
                        break;
                }

                this.ventaBindingSource.EndEdit();
                result = true;
                InitialLoad();
            }
            catch (Exception ex)
            {
                Mensaje.ShowMessageAlert(this.ParentForm, Constantes.Titulo, ex.Message);
            }
            return result;
        }

        private Ventas GetVenta()
        {
            Ventas venta = new Ventas()
            {
                ventaID = Convert.ToInt16(ventaIDLabel.Text),
                clienteID = Convert.ToInt16(clienteIDLabel.Text),
                tipoDocumento = Convert.ToByte(cmbTipoDocumento.SelectedIndex),
                personalID = DatosGenerales.PersonalActual.personalID,
                personalDevolucionID = DatosGenerales.PersonalActual.personalID,
                formaPago = Convert.ToByte(cmbFormaPago.SelectedIndex),
                IGV = _porcIGV,
                servicios = _porcServicios
            };
            venta.DetallesVentasInsumos = new EntitySet<DetallesVentasInsumos>();
            venta.DetallesVentasProductos = new EntitySet<DetallesVentasProductos>();
            venta.DetallesVentasInsumos.AddRange(cwfDetallesVentas1.detallesInsumos);
            venta.DetallesVentasProductos.AddRange(cwfDetallesVentas1.detallesProductos);
            venta.DetallesVentasCombos.AddRange(cwfDetallesVentas1.detallesCombos);
            return venta;
        }

        private bool ValidateData()
        {
            bool result = true;

            if (cwfDetallesVentas1.CantidadDetalle == 0)
            {
                this.errValidator.SetError(this.DetalleLabel, "Ingresar el Detalle.");
                result = false;
            }
            else
            {
                this.errValidator.SetError(this.DetalleLabel, string.Empty);
            }

            if (clienteIDLabel.Text == "-1")
            {
                this.errValidator.SetError(this.clienteCmb, "Seleccionar Cliente.");
                result = false;
            }
            else
            {
                this.errValidator.SetError(this.clienteCmb, string.Empty);
            }

            if (cmbTipoDocumento.SelectedIndex == -1)
            {
                this.errValidator.SetError(this.cmbTipoDocumento, "Seleccionar tipo de documento.");
                result = false;
            }
            else if (string.IsNullOrEmpty(numeroTextBox.Text))
            {
                this.errValidator.SetError(this.cmbTipoDocumento, "Este tipo de documento no tiene series activas.");
                result = false;
            }
            else
            {
                this.errValidator.SetError(this.cmbTipoDocumento, string.Empty);
            }

            if (Convert.ToDecimal(txtTotal.Text) <= 0)
            {
                this.errValidator.SetError(this.txtTotal, "El monto a pagar debe ser mayor que 0.");
                result = false;
            }
            else
            {
                this.errValidator.SetError(this.txtTotal, string.Empty);
            }

            if (string.IsNullOrEmpty(txtPago.Text))
            {
                this.errValidator.SetError(this.txtPago, "Ingrese lo que se debe pagar.");
                result = false;
            }
            else if (Convert.ToDecimal(txtPago.Text)<=0)
            {
                this.errValidator.SetError(this.txtPago, "El monto a pagar debe ser mayor que 0.");
                result = false;
            }
            else if (Convert.ToDecimal(txtVuelto.Text) < 0)
            {
                this.errValidator.SetError(this.txtPago, "El monto a pagar no debe ser menor que el total.");
                result = false;
            }
            else
            {
                this.errValidator.SetError(this.txtPago, string.Empty);
            }

            return result;
        }

        private void EnabledControls(bool valor)
        {
            this.gbxInformacion.Enabled = !valor;
            this.cwfDetallesVentas1.Enabled = !valor;
            this.ventaBindingNavigator.Enabled = valor;
            this.ventaDataGridView.Enabled = valor;
        }

        private void EnabledButtons(bool valor)
        {
            this.TsMenu.EnabledNuevo = valor;
            this.TsMenu.EnabledEditar = valor;
            this.TsMenu.EnabledEliminar = valor;

            if (this.estadoActual == EstadoActual.Nuevo ||
                this.estadoActual == EstadoActual.Editar)
            {
                this.TsMenu.EnabledGuardar = true;
                this.TsMenu.EnabledCancelar = true;
                this.ventaDataGridView.Enabled = false;
            }
            else
            {
                this.TsMenu.EnabledGuardar = false;
                this.TsMenu.EnabledCancelar = false;
                this.ventaDataGridView.Enabled = true;
            }
        }

        private void ClearControls()
        {
            this.ventaIDLabel.Text = "0";
            this.lblCodigo.CargarCodigo(MotivoMovimiento.Ventas, 0);
            this.clienteCmb.Text = "[Seleccionar un Cliente]";
            this.clienteIDLabel.Text = "-1";
            this.cmbTipoDocumento.SelectedIndex = -1;
            this.cmbCorrelativos.SelectedIndex = -1;
            this.numeroTextBox.Text = string.Empty;
            this._porcIGV = this.cwfDetallesVentas1.PorcIGV = Convert.ToDouble(DatosGenerales.IGV);
            this._porcServicios = this.cwfDetallesVentas1.PorcServicios = Convert.ToDouble(DatosGenerales.Servicios);
            this.txtPago.Text = "0";
            this.txtTotal.Text = "0";
            this.txtVuelto.Text = "0";
            this.errValidator.Clear();
        }

        private void SetFont()
        {
            this.font = SystemFonts.IconTitleFont;
            if (this.Font != font)
            {
                this.Font = this.font;
                this.font = new Font("Tahoma", 7);
                this.ventaDataGridView.RowTemplate.Height = (TextRenderer.MeasureText("I", this.font).Height + 5) * 3;
            }
        }

        private void platoDataGridView_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
        {
            if ((e.ColumnIndex >= 0) && (e.RowIndex >= 0))
            {
                Graphics g = e.Graphics;
                bool selected = ((e.State & DataGridViewElementStates.Selected) == DataGridViewElementStates.Selected);
                System.Drawing.Color fcolor = (selected ? e.CellStyle.SelectionForeColor : e.CellStyle.ForeColor);
                System.Drawing.Color bcolor = (selected ? e.CellStyle.SelectionBackColor : e.CellStyle.BackColor);
                Font font = e.CellStyle.Font;
                font = new Font("Tahoma", 7);

                Ventas venta = this.ventaBindingSource[e.RowIndex] as Ventas;

                if (venta != null)
                {
                    int x = e.CellBounds.Left + e.CellStyle.Padding.Left;
                    int y = e.CellBounds.Top + e.CellStyle.Padding.Top;
                    int width = e.CellBounds.Width - (e.CellStyle.Padding.Left + e.CellStyle.Padding.Right);
                    int height = 13 + (e.CellStyle.Padding.Top + e.CellStyle.Padding.Bottom);

                    g.FillRectangle(new SolidBrush(bcolor), e.CellBounds);

                    y = y + height - 1;

                    if (e.ColumnIndex == 0)
                    {
                        font = new Font("Tahoma", 8, FontStyle.Bold);

                        if (selected)
                            TextRenderer.DrawText(e.Graphics, venta.codigo, font, new Rectangle(x, y, width, height), fcolor, TextFormatFlags.PreserveGraphicsClipping | TextFormatFlags.EndEllipsis);
                        else
                            TextRenderer.DrawText(e.Graphics, venta.codigo, font, new Rectangle(x, y, width, height), System.Drawing.Color.Blue, TextFormatFlags.PreserveGraphicsClipping | TextFormatFlags.EndEllipsis);

                        font = new Font("Tahoma", 8);
                        y = y + height - 1;
                        TextRenderer.DrawText(e.Graphics, venta.Correlativos != null ? venta.Correlativos.Resumen : string.Empty + "/" + venta.numero, font, new Rectangle(x, y, width, height), fcolor, TextFormatFlags.PreserveGraphicsClipping | TextFormatFlags.EndEllipsis);
                    }
                    else
                    {
                        font = new Font("Tahoma", 9, FontStyle.Bold);
                        if (selected)
                            TextRenderer.DrawText(e.Graphics, venta.fechaEmision.ToString(), font, new Rectangle(x, y, width, height), fcolor, TextFormatFlags.PreserveGraphicsClipping | TextFormatFlags.EndEllipsis);
                        else
                            TextRenderer.DrawText(e.Graphics, venta.fechaEmision.ToString(), font, new Rectangle(x, y, width, height), System.Drawing.Color.Blue, TextFormatFlags.PreserveGraphicsClipping | TextFormatFlags.EndEllipsis);
                    }
                }

                e.Handled = true;
            }
            else if ((e.ColumnIndex == 0) && (e.RowIndex >= 0))
            {
                e.Paint(e.ClipBounds, e.PaintParts & ~DataGridViewPaintParts.Focus);
                e.Handled = true;
            }
        }

        private void platoDataGridView_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e)
        {
            if (e.RowIndex == this.ventaBindingSource.Position)
            {
                e.DrawFocus(e.RowBounds, true);
            }
            else
            {
                using (Pen p = new Pen(Color.LightGray))
                {
                    e.Graphics.DrawRectangle(p, e.RowBounds);
                }
            }
        }

        private void clienteCmb_DropDown(object sender, EventArgs e)
        {
            cwfClienteBusqueda.limpiar();
            clienteCmb.Text = "[Seleccionar un Cliente]";
        }

        public void clienteBusqueda_SeleccionEntidad(object objeto)
        {
            Clientes cliente = (Clientes)objeto;
            clienteCmb.Text = cliente.nombreCompleto;
            clienteIDLabel.Text = cliente.clienteID.ToString();
            cwfDetallesVentas1.Focus();
            clienteCmb.HideDropDown();
        }

        private void clienteCmb_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Down) clienteCmb.ShowDropDown();
            else e.SuppressKeyPress = true;
        }

        private void cmbComprasEstados_SelectedIndexChanged(object sender, EventArgs e)
        {
            InitialLoad();
        }

        private void cmbTipoDocumento_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (cmbTipoDocumento.SelectedIndex > -1)
            {
                byte tipoDocumento = Convert.ToByte(cmbTipoDocumento.SelectedIndex);
                try
                {
                    List<Correlativos> coleccion = new List<Correlativos>();
                    coleccion.Add(CorrelativosManager.Instancia.ObtenerActivoByTipoDocumento(tipoDocumento));
                    LoadCorrelativo(coleccion);
                }
                catch (Exception ex)
                {
                    Mensaje.ShowMessageAlert(this.ParentForm, Constantes.Titulo, ex.Message);
                } 
            }
        }

        private void txtPago_TextChanged(object sender, EventArgs e)
        {
            CalcularVuelto();
        }

        private void CalcularVuelto()
        {
            decimal pago = 0, total = 0;
            Decimal.TryParse(txtPago.Text, out pago);
            Decimal.TryParse(txtTotal.Text, out total);
            decimal vuelto = pago - total;
            txtVuelto.Text = vuelto.ToString();
        }

        private void Imprimir(int ventaID, decimal pago, decimal vuelto)
        {
            try
            {
                var venta = VentasManager.Instancia.Obtener(ventaID);
                var personal = new PersonalCn().obtenerPersonalPorId(venta.personalID);
                var ticket = new Ticket();

                var logoImpresion = ConfigurationManager.AppSettings.Get("LogoImpresion");
                if (!string.IsNullOrEmpty(logoImpresion)) ticket.HeaderImage = Image.FromFile(logoImpresion);

                var razonSocial = ConfigurationManager.AppSettings.Get("RazonSocial");
                var direccion = ConfigurationManager.AppSettings.Get("Direccion");
                var region = ConfigurationManager.AppSettings.Get("Region");
                var pais = ConfigurationManager.AppSettings.Get("Pais");
                var ruc = ConfigurationManager.AppSettings.Get("RUC");

                ticket.AddHeaderLine(razonSocial);
                ticket.AddHeaderLine(direccion);
                ticket.AddHeaderLine(region + ", " + pais);
                ticket.AddHeaderLine("RUC: " + ruc);

                ticket.AddSubHeaderLine(venta.Correlativos.Resumen + " # " + venta.numero.PadLeft(7, '0'));
                ticket.AddSubHeaderLine("Vendedor: " + personal.nombreCompleto);
                ticket.AddSubHeaderLine(DateTime.Now.ToShortDateString() + " " + DateTime.Now.ToShortTimeString());

                decimal subtotal = 0;
                foreach (var item in venta.detalles)
                {
                    ticket.AddItem(item.cantidad.ToString(), item.nombre, Math.Round(item.precioBruto, 2).ToString());
                    subtotal += item.subTotal;
                }
                subtotal = Math.Round(subtotal, 2);

                decimal igv = Convert.ToDecimal(ConfigurationManager.AppSettings.Get("IGV"));
                decimal total = Math.Round((subtotal * igv) + subtotal, 2);

                ticket.AddTotal("SUB-TOTAL", subtotal.ToString());
                ticket.AddTotal("IGV", igv.ToString());
                ticket.AddTotal("TOTAL", total.ToString());
                ticket.AddTotal(string.Empty, "-------");
                ticket.AddTotal("RECIBIDO", pago.ToString());
                ticket.AddTotal("VUELTO", vuelto.ToString());
                ticket.AddTotal(string.Empty, string.Empty);

                ticket.AddFooterLine("GRACIAS POR TU VISITA...!");

                var impresora = ConfigurationManager.AppSettings.Get("Impresora");
                ticket.PrintTicket(impresora);
            }
            catch (Exception ex)
            {
                Mensaje.ShowMessageAlert(this.ParentForm, Constantes.Titulo, ex.Message);
            }
        }
    }
}
